package com.ruoyi.common.utils;

import cn.hutool.core.map.MapBuilder;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * @author wxl
 * 创建时间：2018/5/28 0028.
 * 修改时间：2018/5/28 0028.
 * 描述： 行业工具类
 */
public class HangyeUtils {

    /**
     * 行业门类的编码与行业代码范围映射
     */
    private static final Map<String, int[]> CODE_CATE_MAPPER = new HashMap(20) {
        {
            //农、林、牧、渔业 01-05
            put("A", new int[]{1, 5});
            //采矿业 06-12
            put("B", new int[]{6, 12});
            //制造业 13-43
            put("C", new int[]{13, 43});
            //电力、热力、燃气及水生产和供应业 44-46
            put("D", new int[]{44, 46});
            //建筑业
            put("E", new int[]{47, 50});
            //批发和零售业
            put("F", new int[]{51, 52});
            //交通运输、仓储和邮政业
            put("G", new int[]{53, 60});
            //住宿和餐饮业
            put("H", new int[]{61, 62});
            //信息传输、软件和信息技术服务业
            put("I", new int[]{63, 65});
            //金融业
            put("J", new int[]{66, 69});
            //房地产业
            put("K", new int[]{70, 70});
            //租赁和商务服务业
            put("L", new int[]{71, 72});
            //科学研究和技术服务业
            put("M", new int[]{73, 75});
            //水利、环境和公共设施管理业
            put("N", new int[]{76, 79});
            //居民服务、修理和其他服务业
            put("O", new int[]{80, 82});
            //教育
            put("P", new int[]{83, 83});
            //卫生和社会工作
            put("Q", new int[]{84, 85});
            //文化、体育和娱乐业
            put("R", new int[]{86, 90});
            //公共管理、社会保障和社会组织
            put("S", new int[]{91, 96});
            //国际组织
            put("T", new int[]{97, 97});
        }
    };



    /**
     * 行业门类的编码与行业代码范围映射
     */
    public static final Map<String, String[]> PILING = new HashMap(20) {
        {

            //批发和零售业
            put("F", new String[]{"零售"," 批发"});

            //住宿和餐饮业
            put("H", new String[]{"住宿业", "餐饮业"});

        }
    };




    /**
     * 行业代码级别
     */
    public static class Level {
        //大类
        public static final int BIG = 1;
        //中类
        public static final int CENTER = 2;
        //小类
        public static final int SMALL = 3;
    }

    /**
     * 代码长度
     */
    public static class CodeLength {
        //大类
        public static final int BIG = 2;
        //中类
        public static final int CENTER = 3;
        //小类
        public static final int SMALL = 4;
    }

    /**
     * 根据级别获取长度
     *
     * @param level 级别
     * @return 当前级别行业代码长度
     */
    public static int getLengthByLevel(int level) {
        switch (level) {
            case Level.BIG:
                return CodeLength.BIG;
            case Level.CENTER:
                return CodeLength.CENTER;
            case Level.SMALL:
                return CodeLength.SMALL;
            default:
                return 0;
        }
    }

    /**
     * 根据长度获取级别
     *
     * @param length 行业代码长度
     */
    public static int getLevelByLength(int length) {
        switch (length) {
            case CodeLength.BIG:
                return Level.BIG;
            case CodeLength.CENTER:
                return Level.CENTER;
            case CodeLength.SMALL:
                return Level.SMALL;
            default:
                return 0;
        }
    }

    /**
     * 截取行业代码
     *
     * @param code  行业代码
     * @param level 截取级别
     */
    public static String getCodeByLevel(String code, int level) {
        if (code == null) {
            return null;
        }
        int levelLen = getLengthByLevel(level);
        //截取字符串
        if (levelLen > code.length()) {
            //要截取的长度大于本身长度,证明级别超过,返回null
            return null;
        }
        return code.substring(0, levelLen);
    }

    /**
     * 获取行业代码存储
     *
     * @param code 行业代码
     */
    public static Map<String, String> getEachLevelCodeMap(String code) {
        MapBuilder<String, String> builder = MapBuilder.create(new HashMap<String, String>());
        return builder.put("code1", getCodeByLevel(code, 1)).put("code2", getCodeByLevel(code, 2)).put("code3", getCodeByLevel(code, 3)).build();
    }

    /**
     * 获取行业代码的门类
     *
     * @param code 行业代码
     */
    public static String getCate(String code) {
        String code1 = getCodeByLevel(code, Level.BIG);
        int codeNum = Integer.parseInt(code1);
        Set<String> cates = CODE_CATE_MAPPER.keySet();
        for (String cate : cates) {
            int[] ints = CODE_CATE_MAPPER.get(cate);
            if (codeNum >= ints[0] && codeNum <= ints[1]) {
                return cate;
            }
        }
        return null;
    }



}
